#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

// 进程地址空间与物理内存之间隔着一张页表
// 子进程和父进程之间独立，但子进程的进程地址空间是父进程的拷贝，其页表的映射是：对于代码，共享同一片代码区域
// 所以看起来全局变量global_var的值在父子进程内各不同，但其地址却相同。
int global_var = 100;

int main()
{
    pid_t id = fork();

    if(id == 0)
    {
        //这是一个子进程
        int cnt = 3;
        while(1)
        {
            while(cnt > 0)
            {
                printf("child: pid: %d; ppid: %d; global_var: %d; &global_var:%p\n", getpid(), getppid(), global_var, & global_var);
                cnt--;
                sleep(1);
            }
            if(cnt == 0)
            {
                global_var = 200;
                printf("此时cnt=0，global_var从100变成200\n");
                cnt--;
            }
            printf("child: pid: %d; ppid: %d; global_var: %d; &global_var:%p\n", getpid(), getppid(), global_var, & global_var);
            sleep(2);
        }
    }
    else //排除掉出错的情况，即id<0;
    {
        //这是一个父进程
        while(1)
        {
            printf("parent:  pid: %d; ppid: %d; global_var: %d; &global_var:%p\n", getpid(), getppid(), global_var, & global_var);
            sleep(2);
        }
    }

    return 0;
}
